
#include "stm32f407_lee_conf.h"


extern osMessageQueueId_t MeaTempHandle;
extern PID temp_stabilization;

extern osEventFlagsId_t SysStatusFlagHandle;

volatile uint16_t Heating_Stop_Time_Num;


/*		SysStatusFlagHandle 	 7 6 5 4  	 3 2 1 0
 *0x01 		0   -->     0 :           1:加热的目标温度更新！
 *0x02      1   -->     0 :           1:加热功率更新！
 *0x04 		2   -->     0 :			  1:停止加热！
 *0x08 		3   -->     0 :           1:加热器已经开启！
 *0x10 		4 	-->		0 :           1:USB CDC 发送完毕
 *0x20 		5 	-->     0 :           1:RS485 发送完毕
 *0x40 		6	-->		0 :           1：温度5-10°内
 *0x80 		7  	--> 	0 :           1：温度5°近
 *0x100 	8	--> 	0 :           1：超调一般 3-5°
 *0x200 	9	--> 	0 :           1：超调很大  5-10°
 *0x400 	10	--> 	0 :           1：超调超级大 >10°
 *0x800 	11	--> 	0 :           1：▲T (加热速率，大于零 加热 小于零降温) < 0
 *0x1000 	12	--> 	0 :           1：▲T	= 0
 *0x2000 	13	--> 	0 :           1：▲T > 0 && ▲T < 0.0625*3
 *0x4000    14 	--> 	0 :           1：▲T >= 0.0625*3
 * */

void Sys_Preparation(void)
{
	//PWM 开始 默认拉高

	HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1);

	//spi flash
	SPI_FLASH_Init();

	//LCD 初始化
	ILI9341_Init(); //lcd初始化
	//ILI9341_GramScan ( 6 ); //设置lcd扫描方式

	//背景显示
	LCD_Show_Background();
	UI_Set_Temperature(60);
	//DWT
	DWT_INIT();

	//GX18B20
	while(GX18B20_Init(Env_GX18B20));
	while(GX18B20_Init(Box_GX18B20));

	//Fuzzy PID
	Fuzzy_PID_Arg_Init(&temp_stabilization);


	//ADC 开始采集
	while(BeginToAcquireADCValue());

	//USB初始化默认生成在默认任务里面

	//使能看门狗
	__HAL_IWDG_START(&hiwdg);
	HAL_IWDG_Refresh(&hiwdg);
}




/*		SysStatusFlagHandle 	 7 6 5 4  	 3 2 1 0
 *0x01 		0   -->     0 :           1:加热的目标温度更新！
 *0x02      1   -->     0 :           1:加热功率更新！
 *0x04 		2   -->     0 :			  1:已经停止加热！
 *0x08 		3   -->     0 :           1:加热器已经开启！
 *0x10 		4 	-->		0 :           1:USB CDC 发送完毕
 *0x20 		5 	-->     0 :           1:RS485 发送完毕
 *0x40 		6	-->		0 :           1：温度5-10°内
 *0x80 		7  	--> 	0 :           1：温度5°近
 *0x100 	8	--> 	0 :           1：超调一般 3-5°
 *0x200 	9	--> 	0 :           1：超调很大  5-10°
 *0x400 	10	--> 	0 :           1：超调超级大 >10°
 *0x800 	11	--> 	0 :           1：▲T (加热速率，大于零 加热 小于零降温) < 0
 *0x1000 	12	--> 	0 :           1：▲T	= 0
 *0x2000 	13	--> 	0 :           1：▲T > 0 && ▲T < 0.0625*3
 *0x4000    14 	--> 	0 :           1：▲T >= 0.0625*3
 *0x8000    15	--> 	0 :           1：加热需停止
 *0x10000   16	--> 	0 :           1：可以启动发送
 *0x20000   						  1：UI界面更新标志位
 *0x40000							  1：跟踪开始标志位
 * */

void SV_TASK(void)
{
	uint32_t Flag;
	Flag = osEventFlagsGet(SysStatusFlagHandle);
	//一些状态判断

	// *0x01 	加热的目标温度更新！
	if(READ_BIT(Flag,0x01)){
		UI_Set_Temperature(Target_Temperature);
		//清除
		osEventFlagsClear (SysStatusFlagHandle,0x01);
	}

	//*0x02     加热功率更新！
	if(READ_BIT(Flag,0x02)){
		UI_Heat_Power();
		//清除
		osEventFlagsClear (SysStatusFlagHandle,0x02);
	}

	 //*0x10 	       1:USB CDC 发送完毕
	if(READ_BIT(Flag,0x10)){
		LED1_Tog();
		osEventFlagsClear (SysStatusFlagHandle,0x10);
	}

	//*0x20           1:RS485 发送完毕
	if(READ_BIT(Flag,0x20)){
		LED2_Tog();
		osEventFlagsClear (SysStatusFlagHandle,0x20);
	}

	//  ----------- -----------------方法 一 ：
	//挂起加热任务 并释放信号量
	//如果只释放一次的话 如何解决温度获取任务的队列填补？
	//赋予一个全局变量 让任务不填充队列 即可达到不挂起加热任务 且致使加热任务处于阻塞态
	//为达到理想效果 需计算相应的挂起时间 应保证挂起时间 < 数据获取任务的不填补时间！
	//-------------------------------------------------------------------------------
	//  ----------- -----------------方法 二 ：
	//法一 只能挂起一个固定的时间 而不能智能的时刻根据 ▲T 来判别绝对 系统应处于的状态 因此不采取
	//不挂起任何任务、给予标志位智能的调整 任务工作模式
	//这里 既让温度获取任务 始终工作并一直传输
	//-------------------------------------------------------------------------------


	//加热 - 不加热 - 动态补偿 --等 状态整定
	/*
	 ...
	 *0x40 		6	-->		0 :           1：温度5-10°内
	 *0x80 		7  	--> 	0 :           1：温度5°近
	 *0x100 	8	--> 	0 :           1：超调一般 3-5°
	 *0x200 	9	--> 	0 :           1：超调很大  5-10°
	 *0x400 	10	--> 	0 :           1：超调超级大 >10°
	 *0x800 	11	--> 	0 :           1：▲T (加热速率，大于零 加热 小于零降温) < 0
	 *0x1000 	12	--> 	0 :           1：▲T	= 0
	 *0x2000 	13	--> 	0 :           1：▲T > 0 && ▲T < 0.0625*3
	 *0x4000    14 	--> 	0 :           1：▲T >= 0.0625*3
	 ......
	*/
	if(READ_BIT(Flag,0x40)){
		Heating_Stop_Time_Num = 20;
		if(READ_BIT(Flag,0x4000)){

			Heating_Stop_Time_Num+=20;
			osEventFlagsClear (SysStatusFlagHandle,0x4000);
		}
		if(READ_BIT(Flag,0x2000)){

			Heating_Stop_Time_Num+=10;
			osEventFlagsClear (SysStatusFlagHandle,0x2000);
		}
		osEventFlagsSet(SysStatusFlagHandle,0x8000);
		osEventFlagsClear (SysStatusFlagHandle,0x40);
	}
	if(READ_BIT(Flag,0x80)){
		Heating_Stop_Time_Num = 10;
		if(READ_BIT(Flag,0x4000)){

			Heating_Stop_Time_Num+=20;
			osEventFlagsClear (SysStatusFlagHandle,0x4000);
		}
		if(READ_BIT(Flag,0x2000)){

			Heating_Stop_Time_Num+=5;
			osEventFlagsClear (SysStatusFlagHandle,0x2000);
		}
		osEventFlagsSet(SysStatusFlagHandle,0x8000);
		osEventFlagsClear (SysStatusFlagHandle,0x80);
	}
	if(READ_BIT(Flag,0x200)){
		Heating_Stop_Time_Num = 20;
		osEventFlagsClear (SysStatusFlagHandle,0x200);
	}
	if(READ_BIT(Flag,0x400)){
		Heating_Stop_Time_Num = 40;
		osEventFlagsClear (SysStatusFlagHandle,0x400);
	}

}



